from autores.forms import AutorForm, ExpertoAutorForm
from autores.models import Autor, AutorOrdenado
from dajax.core import Dajax
from dajaxice.decorators import dajaxice_register
from dajaxice.utils import deserialize_form
from django.shortcuts import get_object_or_404
from django.template.context import RequestContext
from django.template.loader import render_to_string
#from publicaciones.forms import PublicacionForm

#@dajaxice_register
#def agregar_autores_publicacion(request, form_autor,form_publicacion,tipo_publicacion):
#    dajax = Dajax()
#    form_autor = AutorForm(deserialize_form(form_autor))
#    form_publicacion = PublicacionForm(deserialize_form(form_publicacion))
#    if form_autor.is_valid():
#        new_autor = Autor()
#        autores = Autor.objects.all().order_by('orden')
#        new_autor.nombre = form_autor.cleaned_data['nombre']
#        new_autor.apellido = form_autor.cleaned_data['apellido']
#        new_autor.institucion = form_autor.cleaned_data['institucion']
#        new_autor.orden = autores.count() + 1
#        new_autor.save()
#        form = AutorForm()
#        autores = Autor.objects.all().order_by('orden')
#        render = render_to_string('autores/lista.html',{'autores':autores,'form_autores':form},RequestContext(request))
#        dajax.assign('#autores_agregados','innerHTML',render)
#    else:
#        dajax.remove_css_class('#agregar_autores_form input', 'error')
#        for error in form.errors:
#            dajax.add_css_class('#id_%s' % error, 'error')
#            dajax.assign('#id_%s' % error, 'placeholder', 'Este campo es obligatorio')
#    return dajax.json()


@dajaxice_register
def agregar_autores(request, form,tipo):
    dajax = Dajax()
    form = AutorForm(deserialize_form(form))
    if form.is_valid():
        new_autor = Autor()
        autores = Autor.objects.all().order_by('orden')
        new_autor.nombre = form.cleaned_data['nombre']
        new_autor.apellido = form.cleaned_data['apellido']
        new_autor.institucion = form.cleaned_data['institucion']
        new_autor.experto = None
        new_autor.orden = autores.count() + 1
        new_autor.save()
        form = AutorForm()
        form_expertos = ExpertoAutorForm()
        autores = Autor.objects.all().order_by('orden')
        render = render_to_string('autores/lista.html',{'autores':autores,
                                                        'form_autores':form,
                                                        'tipo_publicacion':tipo,
                                                        'form_expertos':form_expertos},
                                  RequestContext(request))
        dajax.assign('#autores_agregados','innerHTML',render)
    else:
        dajax.remove_css_class('#agregar_autores_form input', 'error')
        for error in form.errors:
            dajax.add_css_class('#id_%s' % error, 'error')
            dajax.assign('#id_%s' % error, 'placeholder', 'Este campo es obligatorio')
    return dajax.json()


@dajaxice_register
def agregar_autor_experto(request, form,tipo):
    dajax = Dajax()
    form = ExpertoAutorForm(deserialize_form(form))
    if form.is_valid():
        new_autor = Autor()
        experto = form.cleaned_data['experto']
        autores = Autor.objects.all().order_by('orden')
        new_autor.nombre = experto.nombre
        new_autor.apellido = experto.apellido
        if experto.instituciones.all():
            new_autor.institucion = experto.instituciones.all()[0]
        else:
            new_autor.institucion = ''
        new_autor.orden = autores.count() + 1
        new_autor.experto = experto
        new_autor.save()
        form = AutorForm()
        form_expertos = ExpertoAutorForm()
        autores = Autor.objects.all().order_by('orden')
        render = render_to_string('autores/lista.html',{'autores':autores,
                                                        'form_autores':form,
                                                        'tipo_publicacion':tipo,
                                                        'form_expertos':form_expertos},RequestContext(request))
        dajax.assign('#autores_agregados','innerHTML',render)
    else:
        dajax.remove_css_class('#agregar_autores_form input', 'error')
        for error in form.errors:
            dajax.add_css_class('#id_%s' % error, 'error')
            dajax.assign('#id_%s' % error, 'placeholder', 'Este campo es obligatorio')
    return dajax.json()

@dajaxice_register
def borrar_autor(request, autor_id,tipo):
    autor_id = int(autor_id)
    dajax = Dajax()
    autor = get_object_or_404(Autor,pk=autor_id)
    autor.delete()
    autores = Autor.objects.all().order_by('orden')
    form = AutorForm()
    form_expertos = ExpertoAutorForm()
    render = render_to_string('autores/lista.html',{'autores':autores,
                                                    'tipo_publicacion':tipo,
                                                    'form_autores':form,
                                                    'form_expertos':form_expertos},RequestContext(request))
    dajax.assign('#autores_agregados','innerHTML',render)
    return dajax.json()



@dajaxice_register
def cambiar_lugar(request, autor_id,subir_o_bajar,tipo):
    autor_id = int(autor_id)
    dajax = Dajax()
    autor_a_subir = get_object_or_404(Autor,pk=autor_id)
    if subir_o_bajar == 'subir':
        autor_a_bajar = get_object_or_404(Autor,orden = autor_a_subir.orden - 1)
    else:  
        autor_a_bajar = get_object_or_404(Autor,orden = autor_a_subir.orden + 1)
    form = AutorForm()
    form_expertos = ExpertoAutorForm()
    guardar_orden = autor_a_subir.orden
    autor_a_subir.orden = autor_a_bajar.orden
    autor_a_bajar.orden = guardar_orden
    autor_a_subir.save()
    autor_a_bajar.save()
    autores = Autor.objects.all().order_by('orden')
    render = render_to_string('autores/lista.html',{'autores':autores,
                                                    'tipo_publicacion':tipo,'form_autores':form,
                                                    'form_expertos':form_expertos},RequestContext(request))
    dajax.assign('#autores_agregados','innerHTML',render)
    return dajax.json()


@dajaxice_register
def borrar_todo_los_autores(request,tipo):
    dajax = Dajax()
    form = AutorForm()
    autores = Autor.objects.all()
    for autor in autores:
        autor.delete()
    autores = Autor.objects.all()
    form_expertos = ExpertoAutorForm()
    render = render_to_string('autores/lista.html',{'autores':autores,
                                                    'form_autores':form,
                                                    'tipo_publicacion':tipo,
                                                    'form_expertos':form_expertos},RequestContext(request))
    dajax.assign('#autores_agregados','innerHTML',render)
    return dajax.json()

@dajaxice_register
def borrar_todos_los_autores_sin_refrescar(request,tipo):
    dajax = Dajax()
    autores = Autor.objects.all()
    for autor in autores:
        autor.delete()
    autores = Autor.objects.all()
    return dajax.json()


@dajaxice_register
def agregar_autores_a_autores_ordenados(request,tipo):
    dajax = Dajax()
    lista_de_autores_agregados = []
    autores = Autor.objects.all().order_by('orden')
    for autor in autores:
        autor_ordenado = AutorOrdenado(nombre = autor.nombre,
                                       apellido = autor.apellido,
                                       institucion = autor.institucion,
                                       orden = autor.orden,
                                       experto = autor.experto )
        if autor.experto:
            autor_ordenado.experto = autor.experto
        autor_ordenado.save()
        lista_de_autores_agregados.append(autor_ordenado)
        autor_ordenado = None
    render = render_to_string('autores/lista.html',{'autores_ordenados':lista_de_autores_agregados,
                                                    'form_autores': AutorForm(),
                                                    'form_expertos': ExpertoAutorForm(),
                                                    'termino_agregado_de_autores':True,
                                                    'tipo_publicacion':tipo}
                                                    ,RequestContext(request))
    dajax.assign('#autores_agregados','innerHTML',render)
    autores = Autor.objects.all()
    for autor in autores:
        autor.delete()
    return dajax.json()


@dajaxice_register
def agregar_para_editar(request,autores_a_editar,tipo):
    dajax = Dajax()
    lista_de_autores_agregados = []
    lista_de_autores_agregados_a_editar = []
    render = render_to_string('autores/lista.html',{'autores':lista_de_autores_agregados_a_editar,
                                                        'form_autores': AutorForm(),
                                                        'form_expertos':ExpertoAutorForm(),
                                                        'termino_agregado_de_autores':False,
                                                        'tipo_publicacion':tipo}
                                                        ,RequestContext(request))
    dajax.assign('#autores_agregados','innerHTML',render)
    if autores_a_editar:
        for autor_pk in autores_a_editar:
            autor = get_object_or_404(AutorOrdenado,pk=int(autor_pk))
            lista_de_autores_agregados.append(autor)
        for autor in lista_de_autores_agregados:
            if autor.experto:
                if not autor.experto.instituciones.all():
                    inst = ''
            else:
                if autor.institucion:
                    inst = autor.institucion
                else:
                    inst = ''
               
            autor_ordenado = Autor(nombre = autor.nombre,
                                           apellido = autor.apellido,
                                           institucion = inst,
                                           orden = autor.orden,
                                           experto = autor.experto)
            if autor.experto:
                autor_ordenado.experto = autor.experto
            autor_ordenado.save()
            lista_de_autores_agregados_a_editar.append(autor_ordenado)
            autor_ordenado = None
        render = render_to_string('autores/lista.html',{'autores':lista_de_autores_agregados_a_editar,
                                                        'form_autores': AutorForm(),
                                                        'form_expertos':ExpertoAutorForm(),
                                                        'termino_agregado_de_autores':False,
                                                        'tipo_publicacion':tipo}
                                                        ,RequestContext(request))
        dajax.assign('#autores_agregados','innerHTML',render)
    return dajax.json()





@dajaxice_register
def agregar_para_editar_libro(request,autores_a_editar,tipo):
    dajax = Dajax()
    lista_de_autores_agregados = []
    lista_de_autores_agregados_a_editar = []
    render = render_to_string('autores/lista.html',{'autores':lista_de_autores_agregados_a_editar,
                                                        'form_autores': AutorForm(),
                                                        'form_expertos':ExpertoAutorForm(),
                                                        'termino_agregado_de_autores':False,
                                                        'tipo_publicacion':tipo}
                                                        ,RequestContext(request))
    dajax.assign('#autores_agregados','innerHTML',render)
    if autores_a_editar:
        for autor_pk in autores_a_editar:
            autor = get_object_or_404(AutorOrdenado,pk=int(autor_pk))
            lista_de_autores_agregados.append(autor)
        for autor in lista_de_autores_agregados:
            if autor.experto:
                if not autor.experto.instituciones.all():
                    inst = ''
            else:
                if autor.institucion:
                    inst = autor.institucion
                else:
                    inst = ''
               
            autor_ordenado = Autor(nombre = autor.nombre,
                                           apellido = autor.apellido,
                                           institucion = inst,
                                           orden = autor.orden,
                                           experto = autor.experto)
            if autor.experto:
                autor_ordenado.experto = autor.experto
            autor_ordenado.save()
            lista_de_autores_agregados_a_editar.append(autor_ordenado)
            autor_ordenado = None
        render = render_to_string('autores/lista.html',{'autores':lista_de_autores_agregados_a_editar,
                                                        'form_autores': AutorForm(),
                                                        'form_expertos':ExpertoAutorForm(),
                                                        'termino_agregado_de_autores':False,
                                                        'tipo_publicacion':tipo}
                                                        ,RequestContext(request))
        dajax.assign('#autores_agregados','innerHTML',render)
    return dajax.json()